//package com.boboPlanet.comm.ppt;
//
//import com.boboPlanet.comm.entity.dto.UploadPPTDTO;
//import com.boboPlanet.comm.exception.BusinessException;
//import com.spire.presentation.*;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.ObjectUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.stereotype.Component;
//
//import java.io.File;
//import java.io.InputStream;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.UUID;
//
///**
// * @Description: TODO PPT 操作
// * @Author: mis_wu
// * @Date: 2023/7/19
// * @Company planet
// **/
//@Component
//@Slf4j
//public class PPTOperateTemplate {
//
//    /**
//     * 原文件地址
//     */
//    private String fileUrl;
//
//    /**
//     * 原文件流，与地址二选一即可
//     */
//    private InputStream inputStream;
//
//    /**
//     * 下载地址
//     */
//    private String downPath;
//
//    /**
//     * 替换内容
//     */
//    private Map<String,Object> replaceMap;
//
//    /**
//     * 替换页码
//     */
//    private List<Integer> pages;
//
//    /**
//     * 新文件后缀
//     */
//    private static final String suffix = ".pptx";
//    private static final  String suffix_1 = ".ppt";
//    private static final  String suffix_2 = ".";
//    private static final  String suffix_3 = "\\";
//
//    /**
//     * PPT处理
//     * @param pptDto PPT文件替换对象
//     * @throws Exception E
//     */
//    public void replacePPTContent(UploadPPTDTO pptDto) throws Exception {
//        if (StringUtils.isBlank(pptDto.getSourceFileUrl())){
//            throw BusinessException.build("PPT文件地址不能为空");
//        }
//
//        File file = new File(pptDto.getSourceFileUrl());
//        if (!file.exists()){
//            throw BusinessException.build("PPT文件地址错误，该路径【" + pptDto.getSourceFileUrl() + "】下文件不存在");
//        }
//
//        this.assertParam(pptDto,null);
//
//        //创建Presentation对象
//        Presentation presentation = new Presentation();
//        //加载示例文档
//        presentation.loadFromFile(this.fileUrl);
//
//        this.readPptObject(presentation);
//    }
//
//    /**
//     * 使用文件流修改
//     * @param pptDto PPT文件替换对象
//     * @param inputStream 文件流
//     * @throws Exception E
//     */
//    public void replacePPTContentWithStream(UploadPPTDTO pptDto,InputStream inputStream) throws Exception {
//        if (inputStream == null){
//            throw BusinessException.build("PPT文件不存在,请重新上传");
//        }
//        //参数处理
//        this.assertParam(pptDto,inputStream);
//
//        //创建Presentation对象
//        Presentation presentation = new Presentation();
//        //加载示例文档
//        presentation.loadFromStream(this.inputStream,FileFormat.PPT);
//
//        this.readPptObject(presentation);
//    }
//
//    private void assertParam(UploadPPTDTO dto,InputStream stream){
//        if (dto == null){
//            throw BusinessException.build("PPT文件参数不能为空,请选择上传");
//        }
//        if (StringUtils.isBlank(dto.getTargetFileUrl())){
//            throw BusinessException.build("PPT文件下载地址不能为空,可以指定Windows具体位置");
//        }
//        //判断是全路径还是文件夹路径
//        if (dto.getTargetFileUrl().endsWith(suffix) || dto.getTargetFileUrl().endsWith(suffix_1)){
//            String mk = dto.getTargetFileUrl().substring(0,dto.getTargetFileUrl().lastIndexOf(suffix_3));
//            dto.setTargetFileUrl(mk);
//        }
//        File downFile = new File(dto.getTargetFileUrl());
//        if (!downFile.exists()){
//            boolean mkdirs = downFile.mkdirs();
//            log.error("downPath not exist,create mkdir:{}, for this,downPath is: {}",mkdirs,dto.getTargetFileUrl());
//        }
//        this.downPath = dto.getTargetFileUrl();
//        if (dto.getReplaceList() == null || dto.getReplaceList().isEmpty()){
//            throw BusinessException.build("参数异常,没有指定要替换的PPT内容");
//        }
//        Map<String,Object> map = new HashMap<>();
//        for (UploadPPTDTO.ReplaceMap replaceMap : dto.getReplaceList()) {
//            map.put(replaceMap.getWillReplace(), replaceMap.getReplaced());
//        }
//        if (map.isEmpty()){
//            throw BusinessException.build("没有指定要替换的PPT内容");
//        }
//        this.replaceMap = map;
//        if (StringUtils.isBlank(dto.getSourceFileUrl()) && ObjectUtils.isEmpty(stream)){
//            throw BusinessException.build("没有指定PPT原文件地址,请重新选择");
//        }
//        this.fileUrl = dto.getSourceFileUrl();
//        if (StringUtils.isBlank(dto.getSourceFileUrl())){
//            this.fileUrl = StringUtils.EMPTY;
//        }
//        this.inputStream = stream;
//        if (ObjectUtils.isEmpty(stream)){
//            this.inputStream = null;
//        }
//        this.pages = dto.getPages();
//        if (pages == null || pages.size() == 0){
//            this.pages = null;
//        }
//
//    }
//
//    private void readPptObject(Presentation presentation) throws Exception {
//        //替换全部
//        if (pages == null || pages.isEmpty()){
//            //替换文本
//            replaceText(presentation, replaceMap);
//        }else {
//            //替换指定页数的PPT
//            for (Integer page : pages) {
//                //用户从1开始，但是后台第一页是 0
//                ISlide slide = presentation.getSlides().get(page - 1);
//                if (slide == null){
//                    continue;
//                }
//                replaceTextToPage(slide,replaceMap);
//            }
//        }
//
//        String fileName = UUID.randomUUID().toString();
//
//        String url = downPath + "\\" + fileName + suffix;
//
//        //保存文档
//        presentation.saveToFile(url, FileFormat.PPTX_2013);
//    }
//
//
//    /**
//     * 替换所有幻灯片中指定的的文本
//     * @param presentation PPT对象
//     * @param map 以键值的形式存储需要被替换和用于替换的文本
//     */
//    public static void replaceText(Presentation presentation, Map<String,Object> map) {
//        for (Object slide : presentation.getSlides()) {
//            for (Object shape : ((ISlide)slide).getShapes()) {
//                updateContent(map, shape);
//            }
//        }
//    }
//
//    /**
//     * 替换指定页码的PPT内容
//     * @param slide PPT当前页对象
//     * @param map 替换内容
//     */
//    public static void replaceTextToPage(ISlide slide,Map<String,Object> map){
//        for (Object shape : slide.getShapes()) {
//            updateContent(map, shape);
//        }
//    }
//
//    /**
//     * 更新数据
//     * @param map Map
//     * @param shape Object
//     */
//    private static void updateContent(Map<String, Object> map, Object shape) {
//        if (shape instanceof IAutoShape) {
//            for (Object paragraph : ((IAutoShape) shape).getTextFrame().getParagraphs()) {
//                ParagraphEx paragraphEx =(ParagraphEx)paragraph;
//                for (String key : map.keySet()) {
//                    if (paragraphEx.getText().contains(key)) {
//                        //内容替换
//                        paragraphEx.setText(paragraphEx.getText().replace(key, (CharSequence) map.get(key)));
//                    }
//                }
//            }
//        }
//    }
//
//}
